#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）
//【初阶篇】37.分支和循环do-while循环练习_中 （续）
//【初阶篇】38.休息
//【初阶篇】39.分支和循环do-while循环练习_下（函数待续）
#include<stdio.h>
#include<windows.h>	 //调用了Sleep 延时
#include<string.h>   // 调用了strcmp 比较字符串
#include<stdlib.h>	//调用了system 系统中的cls清屏功能 rand 生成伪随机数 srand 生成伪随机数的种子
#include<time.h>	//调用了time 获取时间戳


//综合练习-猜数字游戏-主菜单函数
void menue()
{
	printf("\n");
	printf("*********************************\n");
	printf("**********【猜 数 游 戏】********\n");
	printf("****                         ****\n");
	printf("****      1.开 始 游 戏      ****\n");
	printf("****                         ****\n");
	printf("****      2.退 出 游 戏      ****\n");
	printf("****                         ****\n");
	printf("**********【范围：1-100】********\n");
	printf("*********************************\n");
}
//综合练习-猜数字游戏-游戏进程函数
void game()
{
	
	int gas = 0;
	int x = 0;
	//RAND_MAX(32767);
	//1.生成随机数 利用rand函数
	int ret = rand()%100+1;//需要0-100 范围的数则通过取除以100的余数（模100）即可，这样模100的余数范围在0-99 再加1即可成为1-100的范围
	//printf("%d\n", ret);//阶段测试
	//2.猜数字
	while (1)
	{
		printf("请输入猜测的数字:>");
		scanf("%d", &gas);
		int arr[90];
		arr[x] = gas;
		x++;
		if (gas > ret)
		{
			printf("猜大了\n");
		}
		else if (gas < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			system("cLs");
			int t = 15;
			int j = 0;
			while (t != 0) 
			{
				printf("恭喜你猜对了!!!\n");
				
				printf("猜数记录：");
				for (j = 0; j < x; j++)
				{
					printf("%d ", arr[j]);
				}
				printf("\n答案是：%d,你一共猜了%d次。\n本轮游戏结束，%d秒后将返回到主菜单。\n", ret, x, t);
				Sleep(1000);
				system("cLs");
				t--;
			}
			break;
		}
	}
}

int main()
{
	
		//练习1 一个有序数组找出某个数字（复习）
		{
	printf("练习1 一个有序数组找出某个数字\n");
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	printf("输入要查找的数字：");
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int le = 0;
	int ri = sz - 1;
	int md = 0;

		while(le <= ri)
		{
			md = le + (ri-le)/2;
			if (arr[md] < k)
			{
				le = md+1;
			}
			else if (arr[md] > k)
			{
				ri = md-1;
			}
			else
			{
				printf("find arr[%d]=%d", md, arr[md]);
				break;
			}
		}
		if (le > ri)
		{
			printf("error value");
		}
		Sleep(2000);
	}
		//---------------------------
	

		//练习2 编写代码演示字符从两端移动向中间汇聚（复习）
		{
			system("cLs");
			printf("练习2 编写代码演示字符从两端移动向中间汇聚\n");
			Sleep(2000);
			system("cLs");
			char ch1[] = { "Welcome to bit!!!" };
			char ch2[] = { "#################" };
			int sz = strlen(ch1);
			int le = 0;
			int ri = sz - 1;
			while (le <= ri)
			{
				ch2[le] = ch1[le];
				ch2[ri] = ch1[ri];
				le++;
				ri--;
				printf("%s\n", ch2);
				Sleep(200);
				system("cLs");
			}
			printf("%s\n", ch2);
		}
		//---------------------------

		//练习3 编写一个模拟用户输入密码的界面，输入3次错误结束程序
		{
		system("cLs");
		printf("练习3 编写一个模拟用户输入密码的界面，输入3次错误结束程序\n");
		char psw[20] = { 0 };
		char cod[] = { "Jiecon" };
		int i = 0;
		for (i = 0; i < 3; i++)
		{
			printf("请输入密码:");
			scanf("%s", psw);
			if (strcmp(psw,cod)== 0)//比较两个字符串是否相等，不能使用== 应该使用库函数strcmp,如果返回值是零表示两个字符串相等
			{
				printf("登录成功\n");
				break;
			}
			else
			{
			printf("密码错误\n");
			}
			}
			if (3 == i)
			{
				printf("3次错误，退出程序:");
			}
		}
		//---------------------------

		//综合练习-猜数字游戏
		{
			//清屏幕
			system("cLs");
			printf("综合练习-猜数字游戏\n");

			int input = 0;
			srand((unsigned int)time(NULL)); 
			//使用srand生成rand的种子，利用time函数返回的随时变化的时间戳
			// 将time_t格式的时间戳数字强制转化为srand函数要求的unsigned int格式的值
			//另外该这个种子只需要在主程序开始时生成一次即可，不然随机数变化的很慢且不够离散
			do
			{
				menue();
				printf("请输入选项:>");
				scanf("%d", &input);
				switch (input)
				{
				case 1:
					system("cLs");
					printf("开始游戏\n");
					game();
					break;

				case 2:
					system("cLs");
					printf("已退出游戏\n");
					break;
				default:
					system("cLs");
					printf("错误选项，重新选择\n");
					break;
				}
			} 
			while (input != 2);
		}
		//---------------------------
		system("cLs");
		printf("结束所有练习");
	return 0;
}